home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / util / cli / mykinf.lha / inf25 / inf.e < prev    next >
Text File  |  1995-06-24  |  9KB  |  292 lines

  1. /* $VER: Inf.e 2.51 (29.04.95) ©1995 Michael Askin
  2. ** A small program to show how  much  space  is left on a volume in
  3. ** bytes. This time the program internals are all in bytes.
  4. **
  5. ** 2.51 (29.04.95) - Fixed bug if no device name on arg
  6. **                   Took out spaces in QUIET
  7. ** 2.5  (20.03.95) - Added Multiple device names
  8. **      (06.04.95) - Only takes first dev name when WIN flag is on.
  9. **
  10. ** 2.4  (8.2.95)   - Printing numbers with comma's
  11. **                 - Watch (was seperate program)
  12. **                 - Window (was seperate program)
  13. **                 - Font sensitivity
  14. **                 - Opening on public screens
  15. */
  16.  
  17. MODULE 'dos/dos','intuition/intuition','intuition/screens'
  18.  
  19. CONST BYTESCUTOFF=102400, KBYTESCUTOFF=8192
  20.  
  21. ENUM ARG_DEVICES,ARG_WB,ARG_BYTE,ARG_KILO,ARG_WATCH,ARG_WINDOW,ARG_SCREEN,ARG_QUIET
  22.  
  23. ENUM ER_NONE, ER_LOCK, ER_INFO, ER_ARGS, ER_WIN, ER_PUBSCREEN, ER_BREAK
  24.  
  25. /* Set common errors. Automatically calls the exception handler. */
  26. RAISE ER_LOCK IF Lock()=NIL,
  27.       ER_INFO IF Info()=NIL,
  28.       ER_WIN IF OpenWindowTagList()=NIL,
  29.       ER_PUBSCREEN IF LockPubScreen()=NIL,
  30.       ER_BREAK IF CtrlC()=TRUE
  31.  
  32. DEF info:infodata  /* Holds the info about the disk */
  33. DEF args:PTR TO LONG /* Holds the arguments */
  34. DEF ver[150]:STRING
  35.  
  36. PROC main() HANDLE
  37.    DEF lock=0, rdargs=0, win:window, port, scr:screen, screenname[30]:STRING
  38.    DEF temp[80]:STRING, device[250]:STRING, watch, window, nodev_flag=FALSE
  39.    DEF devices:PTR TO LONG, i=0
  40.    DEF argstr[200]:STRING
  41.    StrCopy(ver,'$VER:Inf 2.51 (29.04.95) ©1995 Michael Askin',ALL)
  42.    StringF(argstr,'\s\nDEVICES/M,WB/S,B=BYTES/S,KB=KILO/S,W=WATCH/S,WIN=WINDOW/S,PS=PUBLICSCREEN/K,QUIET/S',ver+5)
  43.    args:=[0,0,0,0,0,0,0,0] ; win:=NIL ; scr:=NIL
  44.    /* Do I need the next line? */
  45. /*   devices:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]*/
  46.  
  47.    IF (rdargs:=ReadArgs(argstr,args,NIL))=NIL THEN Raise(ER_ARGS)
  48.  
  49.    IF args[ARG_DEVICES]<>NIL
  50.       devices:=args[ARG_DEVICES]
  51.    ELSE
  52.       devices:=['',0]
  53.    ENDIF
  54.  
  55.    IF args[ARG_SCREEN]<>NIL THEN StrCopy(screenname,args[ARG_SCREEN],ALL) ELSE screenname:=NIL
  56.  
  57.    IF args[ARG_WATCH]=TRUE THEN watch:=TRUE ELSE watch:=FALSE
  58.  
  59.    IF args[ARG_WINDOW]=TRUE THEN window:=TRUE
  60.    IF wbmessage<>0
  61.       window:=TRUE
  62.    ELSE
  63.       IF (args[ARG_QUIET]=FALSE) AND (args[ARG_WINDOW]=FALSE)
  64.          WriteF('\s\n',ver+5)
  65.       ENDIF
  66.    ENDIF
  67.  
  68.    WHILE (nodev_flag=FALSE)
  69.  
  70.       IF devices[i]<>NIL
  71.          StrCopy(device,devices[i],ALL)
  72.       ELSEIF (i=0)
  73.          StrCopy(device,'',ALL)
  74.          nodev_flag:=TRUE
  75.       ELSE
  76.          /*WriteF('Good Bye\n')*/
  77.          Raise(ER_NONE)
  78.       ENDIF
  79.  
  80.       INC i
  81.  
  82.       CtrlC()
  83.  
  84.       /* Find actual name of volume */
  85.       getdevname(device)
  86.  
  87.       lock:=Lock(device,SHARED_LOCK) /* Lock the disk */
  88.  
  89.       IF window=TRUE
  90.          watch:=TRUE
  91.   
  92.          /* Open a window on a pub screen if pos */
  93.          scr:=LockPubScreen(screenname)
  94.          win:=OpenWindowTagList(0,
  95.             [WA_LEFT,640-501,
  96.              WA_TOP,0,
  97.              WA_WIDTH,500,
  98.              WA_HEIGHT,scr.barheight+1,
  99.              WA_IDCMP, IDCMP_CLOSEWINDOW+IDCMP_VANILLAKEY,
  100.              WA_FLAGS,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_DEPTHGADGET+WFLG_RMBTRAP,
  101.              WA_PUBSCREEN, scr,
  102.              0,0])
  103.          /* To make sure we don't keep opening more windows for the other */
  104.          /* device names we make sure we only look at the first dev on    */
  105.          /* list, by setting the nodev flag.                              */
  106.          nodev_flag:=TRUE
  107.       ELSE
  108.          win:=NIL
  109.       ENDIF
  110.  
  111.       IF win<>NIL THEN port:=win.userport /* Any port in a storm! */
  112.  
  113.       REPEAT /* So that even if watch=FALSE, we will get 1 trip */
  114.  
  115.          Info(lock,info) /* Get the info */
  116.  
  117.          /* Print the results */
  118.          showsize(device,win)
  119.  
  120.          IF (window=TRUE OR args[ARG_WATCH]=TRUE)
  121.             Delay(10)
  122.          ENDIF
  123.        
  124.          IF CtrlC()=TRUE THEN watch:=FALSE
  125.          IF win<>NIL THEN IF GetMsg(port)<>0 THEN watch:=FALSE
  126.  
  127.       UNTIL watch=FALSE
  128.       IF win=NIL THEN WriteF('\n')
  129.    ENDWHILE
  130.  
  131.    Raise(ER_NONE)
  132.  
  133. EXCEPT
  134.  
  135.    IF lock THEN UnLock(lock)
  136.    IF rdargs THEN FreeArgs(rdargs)
  137.    IF win THEN CloseWindow(win)
  138.    IF scr THEN UnlockPubScreen(NIL,scr)
  139.  
  140.    SELECT exception
  141.       CASE ER_NONE
  142.       CASE ER_LOCK ; WriteF('Could not find device "\s"\n',device)
  143.       CASE ER_INFO ; WriteF('Could not get info from "\s"\n',device)
  144.       CASE ER_ARGS ; WriteF('Bad Args. Inf ? for help\n')
  145.       CASE ER_WIN  ; WriteF('Could not open window!\n')
  146.       CASE ER_PUBSCREEN ; WriteF('Could not find public screen!\n')
  147.       CASE ER_BREAK ; WriteF('\n***Break\n')
  148.       DEFAULT ; WriteF('Unknown Error \d\n',exception)
  149.    ENDSELECT
  150. ENDPROC
  151.  
  152. PROC showsize(dev,win:PTR TO window)
  153.    DEF size, used, free, freeper
  154.    DEF sizeunits[8]:STRING, usedunits[8]:STRING, freeunits[8]:STRING
  155.    DEF freestring[10]:STRING, usedstring[10]:STRING, sizestring[10]:STRING
  156.    DEF output[100]:STRING, diskstate[40]:STRING, ds=0
  157.  
  158.    /* Full size of unit in bytes */
  159.    size:=Mul(info.numblocks,info.bytesperblock)
  160.  
  161.    /* Used Bytes */
  162.  
  163.    used:=Mul(info.numblocksused,info.bytesperblock)
  164.  
  165.    /* Amount of free bytes */
  166.    free:=size-used
  167.  
  168.    /* Calculate the percentage */
  169.    freeper:=percentage(free,size)
  170.  
  171.    IF args[ARG_QUIET]<>TRUE
  172.       size:=doconversion(size,sizeunits)
  173.       free:=doconversion(free,freeunits)
  174.       used:=doconversion(used,usedunits)
  175.    ENDIF
  176.  
  177.    commanumber(used,usedstring)
  178.    commanumber(free,freestring)
  179.    commanumber(size,sizestring)
  180.  
  181.    /* This bit works out just what the diskstate is */
  182.    ds:=info.diskstate
  183.    SELECT ds
  184.       CASE ID_WRITE_PROTECTED ; StrCopy(diskstate,'Write Protected',ALL)
  185.       CASE ID_VALIDATING ; StrCopy(diskstate,'Not Validated',ALL)
  186.       CASE ID_VALIDATED ; StrCopy(diskstate,'OK',ALL)
  187.    ENDSELECT
  188.  
  189.    IF args[ARG_QUIET]<>TRUE
  190.       IF args[ARG_WB]=TRUE
  191.          StringF(output,'\s \d% full, \s\s free, \s\s in use',dev,100-freeper,freestring,freeunits,usedstring,usedunits)
  192.       ELSE
  193.          StringF(output,'"\s" {\s\s} = \s\s (\d% full,\d% free) Status:\s',dev,sizestring,sizeunits,freestring,freeunits,100-freeper,freeper,diskstate)
  194.       ENDIF
  195.    ELSE
  196.       StringF(output,'\d',free)
  197.    ENDIF
  198.  
  199.    IF win=NIL
  200.       WriteF('\s\b',output)
  201.    ELSE
  202.       SetWindowTitles(win,output,ver+5)
  203.    ENDIF
  204. ENDPROC
  205.  
  206. PROC percentage(amount,full)
  207.    DEF ans
  208.    ans:=Div(amount,Div(full,100))
  209.    IF ans<0 THEN ans:=0
  210.    IF ans>100 THEN ans:=100
  211. ENDPROC ans
  212.  
  213. PROC doconversion(value,units)
  214.    DEF bytescut
  215.    /* Make it possible to set just Kbs and no other value */
  216.    IF args[ARG_KILO]=TRUE THEN bytescut:=0 ELSE bytescut:=BYTESCUTOFF
  217.  
  218.    StrCopy(units,' bytes',ALL)
  219.    IF args[ARG_BYTE]<>TRUE
  220.       IF value>bytescut
  221.          value:=Div(value,1024)
  222.          StrCopy(units,'K',ALL)
  223.       ENDIF
  224.       IF args[ARG_KILO]<>TRUE
  225.          IF ((value>KBYTESCUTOFF) AND (units[0]="K"))
  226.             value:=Div(value,1024)
  227.             StrCopy(units,'M',ALL)
  228.          ENDIF
  229.       ENDIF
  230.    ENDIF
  231. ENDPROC value
  232.  
  233. /* Gets the root directories name, i.e. the volume name, and places it   */
  234. /* in the string specified in the brackets                               */
  235. PROC getdevname(devname)
  236.    DEF lock, oldlock, fib:fileinfoblock
  237.    /* If file does not exist, then prehaps it's a device without the */
  238.    /* colon (:)                                                      */
  239.    IF filethere(devname)=FALSE THEN StrAdd(devname,':',ALL)
  240.    IF lock:=Lock(devname,SHARED_LOCK)
  241.       REPEAT
  242.          oldlock:=lock
  243.          lock:=ParentDir(oldlock)
  244.          Examine(oldlock,fib)
  245.          UnLock(oldlock) /* Don't need it any more */
  246.       UNTIL lock=NIL
  247.       UnLock(lock)
  248.       StrCopy(devname,fib.filename,ALL) /* Copy filename to the string */
  249.       StrAdd(devname,':',ALL)
  250.    ELSE
  251.       WriteF('Could not get device name\n')
  252.    ENDIF
  253. ENDPROC
  254.  
  255. /* Convert a number to a string with comma's !!!!!! */
  256. /* Horribly messy code... but it works! */
  257. PROC commanumber(number,string)
  258.    DEF out[12]:STRING, temp[12]:STRING,i, j, cc
  259.    StringF(temp,'\d',number)
  260.    j:=0
  261.    cc:=-1 /* Comma Count */
  262.    FOR i:=StrLen(temp)-1 TO 0 STEP -1
  263.       INC cc
  264.       IF cc>=3
  265.          cc:=0
  266.          out[j]:=","
  267.          INC j
  268.       ENDIF
  269.       out[j]:=temp[i]
  270.       INC j
  271.    ENDFOR
  272.    out[j]:=0 /* Null on the end */
  273.  
  274.    /* Reverse the string again.. */
  275.    j:=0
  276.    FOR i:=StrLen(out)-1 TO 0 STEP -1
  277.       temp[j]:=out[i]
  278.       INC j
  279.    ENDFOR
  280.    temp[j]:=0
  281.    StrCopy(string,temp,ALL)
  282. ENDPROC string
  283.  
  284. PROC filethere(file) HANDLE
  285.    DEF lock=0
  286.    lock:=Lock(file,ACCESS_READ)
  287.    UnLock(lock)
  288.    RETURN TRUE
  289. EXCEPT
  290.    RETURN FALSE
  291. ENDPROC TRUE
  292.